package com.shayu.aicodemother.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.shayu.aicodemother.ai.model.HtmlCodeResult;
import com.shayu.aicodemother.constant.AppConstant;
import com.shayu.aicodemother.exception.BusinessException;
import com.shayu.aicodemother.exception.ErrorCode;
import com.shayu.aicodemother.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * 抽象代码文件保存器 - 模板方法模式
 *
 * @param <T>
 */
public abstract class CodeFileSaverTemplate<T> {

    /**
     * 文件保存的根目录
     */
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    /**
     * 模板方法：保存代码的标准流程
     *
     * @param result 代码结果对象
     * @param appid  应用id
     * @return 保存的目录
     */
    public final File saveCode(T result,Long appid) {
        //1.校验输入
        validtateInput(result);
        //2.构建唯一目录
        String baseDirPath = buildUniqueDir(appid);
        //3.保存文件（具体实现由子类完成）
        saveFiles(result, baseDirPath);
        //4.返回目录文件对象
        return new File(baseDirPath);
    }


    /**
     * 验证输入参数（可由子类可覆盖）
     *
     * @param result
     */
    protected void validtateInput(T result) {
        if (result == null) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "代码结果不能为空");
        }
    }


    /**
     * 构建文件的唯一路径：tmp/code_output/bizType_雪花 ID
     *
     * @return
     */
//    "{}_{}" 是一个 模板字符串，{} 表示一个占位符。
//    后面的参数会依次填充到 {} 里。File.separator 是 Java 提供的系统相关的路径分隔符
    protected String buildUniqueDir(Long appid) {

        String codeType = getCodeType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", codeType, appid);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }
    /**
     * 保存单个文件
     *
     * @param dirPath
     * @param filename
     * @param content
     */
    protected final  void writeToFile(String dirPath, String filename, String content) {
        String filePath = dirPath + File.separator + filename;
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }



    /**
     * 获取代码生成类型
     *
     * @return 代码生成类型枚举
     */
    protected abstract CodeGenTypeEnum getCodeType();


    /**
     * 保存文件（具体实现交给子类）
     *
     * @param result      代码结果对象
     * @param baseDirPath 基础目录路径
     */
    protected abstract void saveFiles(T result, String baseDirPath);


}
